/*
 * SQLCache.java
 *
 * Created on 18 de Maio de 2007, 17:11
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pt.iscte.dcti.es.rhplus.sistema.persistencia;

import java.util.*;
import java.io.*;

/**
 * Classe que obtem instrucoes SQL guardadas num ficheiro de propriedades e que
 * as manipula, por exemplo para verificar a correccao de uma query.
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class SQLCache {
	/**
	 * As instru��es SQL obtidas a partir do ficheiro ficar�o guardadas num
	 * objecto do tipo Properties (ver
	 * http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html e
	 * http://java.sun.com/docs/books/tutorial/essential/attributes/properties.html )
	 */
	private Properties props = new Properties();
	/**
	 * Nome do ficheiro de propriedades
	 */
	private static final String SQL_FILE = "C:/Users/Hernani/IGE/ES II/RHPlus/src/pt/iscte/dcti/es/rhplus/sistema/persistencia/sql.properties";

	/**
	 * Carrega instrucoes SQL a partir do ficheiro de propriedades e guarda-as
	 * num objecto Properties
	 */
	public void loadSQLStatements() {
		try {
			// carrega as instrucoes SQL a partir de um ficheiro de propriedades
			FileInputStream in = new FileInputStream(SQL_FILE);
			props.load(in);
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Método chamado antes de executar uma query, para substituir as vari�veis
	 * na query pelos par�metros devidos. Os parametros estao guardados numa
	 * Hastable (ver
	 * http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html)
	 */
	public String compileQuery(String qryName, Hashtable params) {
		String qry = getSQLStatement(qryName);
		if (params != null) {
			for (Enumeration enu = params.keys(); enu.hasMoreElements();) {
				String key = (String) enu.nextElement();
				String value = params.get(key).toString();
				qry = qry.replaceAll(key, value);
			}
		}
		return qry;
	}

	/**
	 * Metodo que verifica se uma instrução SQL existe
	 */
	public String getSQLStatement(String sqlName) {
		String sqlStm = (String) props.get(sqlName);
		if (sqlStm == null) {
			throw new NullPointerException("A instrução SQL não foi encontrada.");
		} else {
			return sqlStm;
		}
	}
}